package com.github.xiaoymin.map.request.baidu;

import cn.hutool.core.collection.CollectionUtil;
import com.github.xiaoymin.map.common.MapClientConstants;
import com.github.xiaoymin.map.common.em.BaiduCoordEnums;
import com.github.xiaoymin.map.common.em.TencentCoordEnums;
import com.github.xiaoymin.map.exception.MapClientException;
import com.github.xiaoymin.map.model.MapLocation;
import com.github.xiaoymin.map.request.tencent.TencentCoordTranslateRequest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class BaiduCoordTranslateRequest {

    /**
     * 预转换的坐标，支持批量转换，
     * 格式：需转换的源坐标，多组坐标以“；”分隔（经度，纬度）
     * 批量支持坐标个数以HTTP GET方法请求上限为准
     */
    private List<MapLocation> coords=new ArrayList<>();


    /**
     *源坐标类型：默认值为1
     * 1：GPS设备获取的角度坐标，WGS84坐标;
     * 2：GPS获取的墨卡托平面坐标、sogou地图所用坐标;
     * 3：google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标，国测局（GCJ02）坐标;
     * 4：3中列表地图坐标对应的墨卡托平面坐标;
     * 5：百度地图采用的经纬度坐标;
     * 6：百度地图采用的墨卡托平面坐标;
     * 7：mapbar地图坐标;
     * 8：51地图坐标
     */
    private Integer from= BaiduCoordEnums.GPS.getNum();

    public List<MapLocation> getCoords() {
        return coords;
    }

    public void setCoords(List<MapLocation> coords) {
        this.coords = coords;
    }

    public Integer getFrom() {
        return from;
    }

    public void setFrom(Integer from) {
        this.from = from;
    }

    public BaiduCoordTranslateRequest(List<MapLocation> coords, Integer from) {
        this.coords = coords;
        this.from = from;
    }

    /**
     * 获取当前对象的map参数
     * @return 参数map
     */
    public Map<String,String> toMap(){
        Map<String,String> parameterMap=new HashMap<>();
        String locations= CollectionUtil.join(coords.stream().map(mapLocation -> mapLocation.getLng()+","+mapLocation.getLat()).collect(Collectors.toList()), MapClientConstants.BAIDU_JOIN_ELEMENT_CHAR);
        parameterMap.put("coords",locations);
        parameterMap.put("from",from.toString());
        return parameterMap;
    }

    public static class Builder{
        /**
         * 预转换的坐标，支持批量转换，
         * 格式：需转换的源坐标，多组坐标以“；”分隔（经度，纬度）
         * 批量支持坐标个数以HTTP GET方法请求上限为准
         */
        private List<MapLocation> coords=new ArrayList<>();

        /**
         *源坐标类型：默认值为1
         * 1：GPS设备获取的角度坐标，WGS84坐标;
         * 2：GPS获取的墨卡托平面坐标、sogou地图所用坐标;
         * 3：google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标，国测局（GCJ02）坐标;
         * 4：3中列表地图坐标对应的墨卡托平面坐标;
         * 5：百度地图采用的经纬度坐标;
         * 6：百度地图采用的墨卡托平面坐标;
         * 7：mapbar地图坐标;
         * 8：51地图坐标
         */
        private Integer from= TencentCoordEnums.getNum("DEFAULT");

        /**
         * 添加地理位置
         * @param mapLocation 经纬度坐标对象
         * @return 当前Builder对象
         */
        public BaiduCoordTranslateRequest.Builder addLocation(MapLocation mapLocation){
            coords.add(mapLocation);
            return this;
        }

        /**
         * 转换坐标系类型
         * @param from 坐标系类型
         * @return 当前Builder对象
         */
        public BaiduCoordTranslateRequest.Builder coordType(Integer from){
            this.from=from;
            return this;
        }

        /**
         * 添加地理位置
         * @param lng 经度
         * @param lat 纬度
         * @return 当前Builder对象
         */
        public BaiduCoordTranslateRequest.Builder addLocation(String lng, String lat){
            coords.add(new MapLocation(lng,lat));
            return this;
        }

        /**
         * 构造逆址编码请求对象
         * @return 逆址编码请求对象
         */
        public BaiduCoordTranslateRequest build(){
            if (CollectionUtil.isEmpty(coords)){
                throw new MapClientException("转换坐标不能为空");
            }
            return new BaiduCoordTranslateRequest(coords,from);
        }
    }
}
